#include "at24c02.h"

// 初始化
void AT24C02_Init(void)
{
    IIC_Init();
}

// 向 EEPROM 写入一个字节
void AT24C02_WriteByte(uint8_t addr, uint8_t data)
{
    IIC_Start();
    IIC_SendByte(W_ADDR);
    uint8_t ack = IIC_ReceiveACK();
    if (ack == ACK)
    {
        IIC_SendByte(addr); // 那个地址
        IIC_ReceiveACK();   // 接收ACK
        IIC_SendByte(data); // 写入数据
        IIC_ReceiveACK();   // 接收ACK
        IIC_Stop();         // 停止信号
    }
}

// 从 EEPROM 读取一个字节
uint8_t AT24C02_ReadByte(uint8_t addr)
{
    // 发出一个起始信号
    IIC_Start();
    // 发送写地址(假写)
    IIC_SendByte(W_ADDR);
    // 接收ACK
    IIC_ReceiveACK();
    // 发送要读取的地址
    IIC_SendByte(addr);
    // 接收ACK
    IIC_ReceiveACK();

    // 发出读信号
    IIC_Start();
    // 发送读地址
    IIC_SendByte(R_ADDR);
    // 接收ACK
    IIC_ReceiveACK();
    // 读取数据
    uint8_t data = IIC_ReceiveByte();
    // 发送一个非应答
    IIC_SendNACK();
    // 停止信号
    IIC_Stop();
    //
    return data;
}

// 连续写入多个字节(页写)
void AT24C02_WriteBytes(uint8_t addr, uint8_t *bytes, uint8_t size)
{
    IIC_Start();
    IIC_SendByte(W_ADDR);
    uint8_t ack = IIC_ReceiveACK();
    if (ack == ACK)
    {
        IIC_SendByte(addr);
        IIC_ReceiveACK();
        for (uint8_t i = 0; i < size; i++)
        {
            IIC_SendByte(bytes[i]);
            IIC_ReceiveACK();
        }
    }
    IIC_Stop();
    // 等待写入完成
    delay_ms(10);
}

// 连续读取多个字节
void AT24C02_ReadBytes(uint8_t addr, uint8_t *buffer, uint8_t size)
{
    IIC_Start();
    IIC_SendByte(W_ADDR);
    IIC_ReceiveACK();
    IIC_SendByte(addr);
    IIC_ReceiveACK();

    IIC_Start();
    IIC_SendByte(R_ADDR);
    IIC_ReceiveACK();
    for (uint8_t i = 0; i < size; i++)
    {
        buffer[i] = IIC_ReceiveByte();

        // 发送应答或非应答
        if (i < size - 1)
        {
            IIC_SendACK();
        }
        else
        {
            IIC_SendNACK();
        }
    }
    IIC_Stop();
}